iT邦幫忙

2022 iThome 鐵人賽

DAY 10
1
自我挑戰組

[Dot Net Core](圖解系列與常用套件)系列 第 10

[Dot Net Core](圖解系列) 10.優秀的套件 - Autofac 如何替代 Dot Net Core 的原生DI機制

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20220910/20144614XK5cyUg00b.jpg

這邊先看一個優秀的套件 - Autofac ,看它是如何在 dot net core 框架中替代 Native IOC mechanism。

這次要了解如何為Dot NET Core MVC應用程式達成DI,勢必也要先了解Dot NET Core原本是如何運作的。所以前面章節有多篇是在闡述DI機制的原理與軌跡。而Autofac套件會挑出原本 Dot NET Core 產生 Service Provider 的地方做比較,然後替換成Autofac套件所使用的物件。

原本Dot NET Core 產生 Service Provider如下:
https://ithelp.ithome.com.tw/upload/images/20220910/20144614mufedKdEgV.jpg

利用預設的 ServiceFactoryAdapter 與 DefaultServiceProviderFactory,建立了Provider。

其以ServiceCollection為參數透過DynamicServiceProviderEngine與父類別ServiceProviderEngine產生CallSiteFactory實體為屬性,存回HostBuilder的_appServices。如果要實現已經註冊的服務,可以呼叫透過DynamicServiceProviderEngine繼承的ServiceProvider中的函示GetService來進行resolve。

所以整個藍色的 Microsoft.Extensions.DependencyInjection 區域就是產生 Provider 的關鍵處。如果要取代成由Autofac來做DI,HostBuilder的_appServices 勢必要取到由 Autofac 所產生的 Provider。

所以替換如下:

https://ithelp.ithome.com.tw/upload/images/20220910/20144614NeKLFm0Yxa.jpg

經由替換成 AutofacServiceProviderFactory後,其CreateBuilder函式所產生的容器就是 Autofac 的 ContainerBuilder 了,在這個函式會將原本Dot NET Core 的 ServiceCollection 所包含註冊好的 service 的東西轉成註冊到 ContainerBuilder 上。

接下來呼叫AutofacServiceProviderFactory的CreateServiceProvider函式,會將 Autofac 的 ContainerBuilder做 build的動作,將註冊好的的服務設置好。關於此未來會於一個小節來闡述 “Autofac 套件如何達成IOC 目的- 概述圖解”。

接下來開發者可以於專案中的 Startup 類別 加入下列函式,註冊想要resolve的服務至 Autofac Container 中:

public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterModule(new AutofacModule());
}

此段函式會在 Startup.ConfigureServices 在做 services.AddControllersWithViews() 或 services.AddController() 時,會執行Microsoft.AspNetCore.Hosting 下的 GenericWebHostBuilder 的 UseStartup 會抓出此 method 來執行。

最後將範例做簡單的展示:

https://ithelp.ithome.com.tw/upload/images/20220910/20144614YCTIAOWbrQ.jpg

https://ithelp.ithome.com.tw/upload/images/20220910/20144614QxYTuHAfjc.jpg

https://ithelp.ithome.com.tw/upload/images/20220910/20144614pxMXA9InSv.jpg

https://ithelp.ithome.com.tw/upload/images/20220910/20144614kiOY9YHbVc.jpg

https://ithelp.ithome.com.tw/upload/images/20220910/20144614jT1oxnRWCv.jpg


上一篇
[Dot Net Core](圖解系列) 9. Resolve Controller class process
下一篇
[Dot Net Core] (圖解系列) 11. Dot Net Core MVC 與 Asp.NET MVC 比較 - Controller的 Factory 與 Provider 的決定時機
系列文
[Dot Net Core](圖解系列與常用套件)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言